package tt.dz.order.droolstest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.ReleaseId;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Component;

@Component
public class DroolsHelloWorld {
	
	public DroolsHelloWorld(){
		
	}
	
	//@PostConstruct
    public void init() {
    	String filePath = this.getClass().getResource("HelloWorld.drl").getPath();
        File drlFile = new File(filePath);
        int len = new Long(drlFile.length()).intValue();
        byte[] bytes = new byte[len];
        FileInputStream is = null;
		try {
			is = new FileInputStream(drlFile);
	        is.read(bytes);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
	        try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println(System.currentTimeMillis());
		
        KieServices ks = KieServices.Factory.get();
        
        KieFileSystem kfs = ks.newKieFileSystem();
        
        ReleaseId releaseId = ks.newReleaseId( "org.test", "myTest", "1.0-SNAPSHOT" );
        
        KieBuilder kieBuilder = ks.newKieBuilder( kfs );
        
        kfs.generateAndWritePomXML( releaseId );
        
        kfs.delete("dztt");
        
        kfs.write( ks.getResources().newByteArrayResource(bytes).setResourceType( ResourceType.DRL ).setSourcePath( "dztt/drl1.drl" ));
        
        kieBuilder.buildAll();
        
        KieContainer kc = ks.newKieContainer( releaseId );

        execute( kc );
    }

    public static void execute( KieContainer kc ) {
        // From the container, a session is created based on
        // its definition and configuration in the META-INF/kmodule.xml file
    	System.out.println(System.currentTimeMillis());
        KieSession ksession = kc.newKieSession();

        // Once the session is created, the application can interact with it
        // In this case it is setting a global as defined in the
        // org/drools/examples/helloworld/HelloWorld.drl file
        ksession.setGlobal( "list", new ArrayList<Object>() );

        // The application can also setup listeners
        //ksession.addEventListener( new DebugAgendaEventListener() );
        //ksession.addEventListener( new DebugRuleRuntimeEventListener() );

        // To setup a file based audit logger, uncomment the next line
        // KieRuntimeLogger logger = ks.getLoggers().newFileLogger( ksession, "./helloworld" );

        // To setup a ThreadedFileLogger, so that the audit view reflects events whilst debugging,
        // uncomment the next line
        // KieRuntimeLogger logger = ks.getLoggers().newThreadedFileLogger( ksession, "./helloworld", 1000 );

        // The application can insert facts into the session
        final Message message = new Message();
        message.setMessage( "Hello World" );
        message.setStatus( Message.GOODBYE );
        ksession.insert( message );

        // and fire the rules
        ksession.fireAllRules();

        // Remove comment if using logging
        // logger.close();

        // and then dispose the session
        ksession.dispose();
        System.out.println(System.currentTimeMillis());
    }

    public static class Message {
        public static final int HELLO   = 0;
        public static final int GOODBYE = 1;

        private String          message;

        private int             status;

        public Message() {

        }

        public String getMessage() {
            return this.message;
        }

        public void setMessage(final String message) {
            this.message = message;
        }

        public int getStatus() {
            return this.status;
        }

        public void setStatus(final int status) {
            this.status = status;
        }

        public static Message doSomething(Message message) {
            return message;
        }

        public boolean isSomething(String msg,
                                   List<Object> list) {
            list.add( this );
            return this.message.equals( msg );
        }
    }

}
